
import iconPicker from 'e-icon-picker'
import 'e-icon-picker/lib/symbol.js' // 基本彩色图标库
import 'e-icon-picker/lib/index.css' // 基本样式，包含基本图标
import 'font-awesome/css/font-awesome.min.css' // font-awesome 图标库
import 'element-ui/lib/theme-chalk/icon.css' // element-ui 图标库
// Vue
import Vue from 'vue'
import i18n from './i18n'
import App from './App'
// 核心插件
import zeroVue from '@/plugin/zerovue'
// store
import store from '@/store/index'

// 菜单和路由设置
import router, { constantRoutes, createRoutesInLayout, routesOutLayout, resetRouter } from './router'
import { request } from './api/axios'
import { hasPermission, handleMenu, handleRouter } from './api/common'
import util from '@/libs/util.js'
import JSEncrypt from 'jsencrypt'
import JsonViewer from 'vue-json-viewer'
import 'xe-utils'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
import ZeroDialog from '@/components/zero-dialog/ZeroDialog' // 弹框
import ZeroSearch from '@/components/zero-search/ZeroSearch' // 头部查询模块
import ZeroPage from '@/components/zero-page/ZeroPage' // 分页模块
Vue.component('zero-dialog', ZeroDialog)
Vue.component('zero-search', ZeroSearch)
Vue.component('zero-page', ZeroPage)
Vue.use(VXETable)

Vue.use(iconPicker, { eIcon: false })
Vue.use(JsonViewer)

// 核心插件
Vue.use(zeroVue)

// 将axios封装加入到Vue 原型里 直接this.$axios调用
Vue.prototype.$axios = request
Vue.prototype.$hasPermission = hasPermission

Vue.prototype.$getRsaCode = function (str) { // 注册方法
  const encryptStr = new JSEncrypt()
  encryptStr.setPublicKey(process.env.VUE_APP_RSA) // 设置 加密公钥
  const data = encryptStr.encrypt(str.toString()) // 进行加密
  return data
}
/**
 * 刷新时，请求接口获取菜单和路由数据，保证获取到的数据是最新的，实现动态添加菜单和路由后刷新页面就能使用
 */
request({ url: '/sysUser/initFrontEndInfo', method: 'get' }).then(res => {
  /**
   * 判断是否有res，当
   */
  if (res && res.data) {
    // [菜单] 处理菜单
    const menu = handleMenu(res.data.menuInfo)
    // [菜单] 设置侧边栏菜单
    store.commit('zerovue/menu/asideSet', menu)
    // [菜单] 初始化菜单搜索功能
    store.commit('zerovue/search/init', menu)
    // [权限] 缓存权限
    util.storage.set('powers', res.data.powerInfo)
    // [ 路由 ] 处理路由
    var zero = handleRouter(res.data.routerInfo)
    // [ 路由 ] 计算路由
    const routes = createRoutesInLayout(zero).concat(routesOutLayout)
    // [ 路由 ] 重新设置路由
    resetRouter(routes)
    // [ 路由 ] 重新设置多标签页池
    store.commit('zerovue/page/init', routes)
  } else {
    // 删除
    util.storage.removeAll()
    // [ 路由 ] 重新设置多标签页池
    store.commit('zerovue/page/init', constantRoutes)
  }
  new Vue({
    router,
    store,
    i18n,
    render: h => h(App),
    mounted () {
      // 展示系统信息
      this.$store.commit('zerovue/releases/versionShow')
      // 用户登录后从数据库加载一系列的设置
      this.$store.dispatch('zerovue/account/load')
      // 获取并记录用户 UA
      this.$store.commit('zerovue/ua/get')
      // 初始化全屏监听
      this.$store.dispatch('zerovue/fullscreen/listen')
    }
  }).$mount('#app')
}).catch(() => {
  new Vue({
    router,
    store,
    i18n,
    render: h => h(App),
    created () {
      // 删除
      util.storage.removeAll()
      // 处理路由 得到每一级的路由设置
      this.$store.commit('zerovue/page/init', constantRoutes)
    },
    mounted () {
      // 展示系统信息
      this.$store.commit('zerovue/releases/versionShow')
      // 用户登录后从数据库加载一系列的设置
      this.$store.dispatch('zerovue/account/load')
      // 获取并记录用户 UA
      this.$store.commit('zerovue/ua/get')
      // 初始化全屏监听
      this.$store.dispatch('zerovue/fullscreen/listen')
    }
  }).$mount('#app')
})
